package sesion;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.labs.repackaged.org.json.JSONArray;
import com.google.appengine.labs.repackaged.org.json.JSONObject;

import entity.Proizvod;

public class ProizvodDaoJpa extends GenericJpaDao<Proizvod, Key> implements ProizvodDao{
	
	public Proizvod pronadjiProizvod(String naziv)
	{
		Proizvod proizvod=null;
		EntityManager em = null;
	    try {
	        em = emf.createEntityManager();
	        Query query = em.createQuery("select m from " + persistentClass.getSimpleName()+" m where m.naziv='"+naziv+"'");
	        proizvod=(Proizvod)query.getSingleResult();
	    }
	    catch(NoResultException ex)
	    {
	    	
	    }
	    catch (Exception ex) {
	        ex.printStackTrace();
	    }
	    finally
	    {
	    	em.close();
	    }
		return proizvod;
	}
	
	@SuppressWarnings("unchecked")
	public List<Proizvod> pronadjiProizvode(String naziv)
	{
		List<Proizvod> proizvodi=null;
		EntityManager em = null;
	    try {
	        em = emf.createEntityManager();
	        Query query = em.createQuery("select m from " + persistentClass.getSimpleName()+" m where m.naziv='"+naziv+"'");
	        proizvodi=query.getResultList();
	    }
	    catch(NoResultException ex)
	    {
	    	
	    }
	    catch (Exception ex) {
	        ex.printStackTrace();
	    }
	    finally
	    {
	    	em.close();
	    }
		return proizvodi;
	}
	
	public void izbrisiProizvod(String pom) {
		EntityManager em = null;
	    EntityTransaction tx = null;

	    try {
	        em = emf.createEntityManager();
	        Query query = em.createQuery("select m from " + persistentClass.getSimpleName()+" m where m.naziv='"+pom+"'");
	        @SuppressWarnings("unchecked")
			List<Proizvod> proizvodi = query.getResultList();
	        if(proizvodi!=null)
	        {
	        	for (Proizvod proizvod : proizvodi) {
	        		if(proizvod.getId().toString().contains("Prodavac"))
	        		{
			        	tx = em.getTransaction();
				        tx.begin();
			        	em.remove(proizvod);
			        	tx.commit();
			        	break;
	        		}
	        	}
	        }
	    }
	    catch(NoResultException ex)
	    {
	    	
	    }
	    catch (Exception ex) {
	    	ex.printStackTrace();
	        if (tx != null) {
	        tx.rollback();
	        }
	    }
	    finally
	    {
	    	em.close();
	    }
	}
	
	public void izmeniProizvod(String naziv,String opis,int cena) {
		EntityManager em = null;
	    EntityTransaction tx = null;

	    try {
	        em = emf.createEntityManager();
	        
	        Query query = em.createQuery("select m from " + persistentClass.getSimpleName()+" m where m.naziv='"+naziv+"'");
	        @SuppressWarnings("unchecked")
			List<Proizvod> proizvodi = query.getResultList();
	        if(proizvodi!=null)
	        {
	        	for (Proizvod proizvod : proizvodi) {
	        		if(proizvod.getId().toString().contains("Prodavac"))
	        		{
			        	tx = em.getTransaction();
				        tx.begin();
				        proizvod.setCena(cena);
			        	proizvod.setOpis(opis);
			        	em.merge(proizvod);
			        	tx.commit();
			        	break;
	        		}
	        	}
	        }
	    }
	    catch(NoResultException ex)
	    {
	    	
	    }
	    catch (Exception ex) {
	    	ex.printStackTrace();
	        if (tx != null) {
	        tx.rollback();
	        }
	    }
	    finally
	    {
	    	em.close();
	    }
	}
	
	public List<Proizvod> vratiKupceveProizvode()
	{
		List<Proizvod> proizvodi=new ArrayList<Proizvod>();
		for (Proizvod proizvod : findAll()) {
			if(proizvod.getId().toString().contains("Kupac"))
				proizvodi.add(proizvod);
		}
		return proizvodi;
	}
	
	public List<Proizvod> pronadjiProdavceveProizvode(ArrayList<String> pomProizvodi)
	{
		ArrayList<Proizvod> proizvodi=new ArrayList<Proizvod>();
		ArrayList<Proizvod> konacniProizvodi=new ArrayList<Proizvod>();
		
		for (String proizvod : pomProizvodi) {
			proizvodi.addAll(pronadjiProizvode(proizvod));
		}
		
		for (Proizvod proizvod : proizvodi) {
			if(proizvod.getId().toString().contains("Prodavac"))
				konacniProizvodi.add(proizvod);
		}
		
		/*
		for (Proizvod proizvod : findAll()) {
			if(proizvod.getId().toString().contains("Prodavac"))
				proizvodi.add(proizvod);
		}
		
		for (Proizvod proizvod : proizvodi) {
			for (Proizvod pomProizvod : pomProizvodi) {
				if(proizvod.getNaziv().equals(pomProizvod))
					konacniProizvodi.add(proizvod);
			}
			
		}*/
		return konacniProizvodi;
	}
	
	public List<Proizvod> vratiProdavceveProizvode()
	{
		List<Proizvod> proizvodi=new ArrayList<Proizvod>();
		for (Proizvod proizvod : findAll()) {
			if(proizvod.getId().toString().contains("Prodavac"))
				proizvodi.add(proizvod);
		}
		return proizvodi;
	}
	
	public JSONArray vratiJsonProizvode()
	{
		JSONArray objekti=new JSONArray();
		JSONObject ob=null;
		
		for (Proizvod proizvod : findAll()) {
			if(proizvod.getId().toString().contains("Prodavac"))
			{
				ob=new JSONObject(proizvod);
				objekti.put(ob);
			}
		}
		return objekti;
	}
	
	public String pronadjiProizvodNaziv(String naziv)
	{
		for (Proizvod pom : vratiProdavceveProizvode()) 
		{
			if(pom.getNaziv().equals(naziv))
				return "naso";
		}
		return "nista";
	}
}
